
// 定义一个模块
mod aaa{
    const X: i32 = 10;

    fn print_aaa() {
        println!("{}", 42);
    }
    mod bbb {
        fn print_bbb() {
            println!("{}", 37);
        }
    }
}

mod my_mod {
    // 模块中的项默认具有私有的可见性
    fn private_function() {
        println!("called `my_mod::private_function()`");
    }

    // 使用 `pub` 修饰语来改变默认可见性。
    pub fn function() {
        println!("called `my_mod::function()`");
    }

    // 使用 `pub(in path)` 语法定义的函数只在给定的路径中可见。
    // `path` 必须是父模块（parent module）或祖先模块（ancestor module）
    pub(in crate::my_mod) fn public_function_in_my_mod() {
        print!("called `my_mod::nested::public_function_in_my_mod()`, that\n > ");
        public_function_in_nested()
    }

    // 使用 `pub(self)` 语法定义的函数则只在当前模块中可见。
    pub(self) fn public_function_in_nested() {
        println!("called `my_mod::nested::public_function_in_nested");
    }

    // 使用 `pub(super)` 语法定义的函数只在父模块中可见。
    pub(super) fn public_function_in_super_mod() {
        println!("called my_mod::nested::public_function_in_super_mod");
    }

    // `pub(crate)` 使得函数只在当前 crate 中可见
    pub(crate) fn public_function_in_crate() {
        println!("called `my_mod::public_function_in_crate()");
    }
}

mod mod_my{

    // 定义解构体成员变量
    pub struct ReponseData<T>{
        pub msg_code:i32,
        pub msg:String,
        pub data: T
    }


    // 利用impl关键字来定义结构体成员方法
    impl<T> ReponseData<T> {
        fn contruct (data:T)->ReponseData<T>{
            ReponseData{
                msg_code:0,
                msg:"请求成功",
                data:data
            }
        }
    }
}


// 让外部使用模块的item
// 外部引用使用关键字use

// 可以加上pub修饰语来表示模块中的项是否可见
pub  mod ccc {
    fn print_ccc() {
        println!("{}", 37);
    }
}

// self
// self 在路径中，有两种意思：
// use self::xxx 表示，加载当前模块中的 xxx。此时 self 可省略；
// use xxx::{self, yyy}，表示，加载当前路径下模块 xxx 本身，以及模块 xxx 下的 yyy；

// super 表示，当前模块路径的上一级路径，可以理解成父模块。
// use super::xxx;
// 表示引用父模块中的 xxx。

// 另外，还有一种特殊的路径形式：
// ::xxx::yyy
// 它表示，引用根路径下的 xxx::yyy，这个根路径，指的是当前 crate 的根路径。

// 路径中的 * 符号：
// use xxx::*;
// 表示导入 xxx 模块下的所有可见 item（加了 pub 标识的 item）


// 加载外部create
// extern crate xxx;
// 还必须在 Cargo.toml 的 dependecies 段，加上 xxx="version num" 这
// 自定义名称
// extern crate xxx as foo;
// use foo::yyy::zzz;


// 错误处理
// 抛出异常：
// 作为值返回

// 谨慎使用panic 会导致当前线程结束，甚至是整个程序的结束
// fn guess(n: i32) -> bool {
//     if n < 1 || n > 10 {
//         panic!("Invalid number: {}", n);
//     }
//     n == 5
// }

// option
